/******************************************
Probando_Banco.java
Universidad del Valle de Guatemala
Algoritmos y Estructura de Datos
Autor:
    Martín Guzmán
Fecha: 02 de septiembre de 2009
Descripción: 
*******************************************/

import java.lang.reflect.Array;
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Random;

public class Probando_Cola {
    private static int hacer;
    private static Scanner scan = new Scanner(System.in);
    private static final int rango= 10000;
    private static final int cant=1000;

    private static ArrayList<Integer> Numeros = new ArrayList<Integer>();
    private static Cola_implementacion_heap<Integer> Cola_heap_propio = new Cola_implementacion_heap<Integer>(cant);
    private static Cola_implementacion_JCF<Integer> Cola_heap_JCF = new Cola_implementacion_JCF<Integer>(cant);


    //método main donde empieza la ejecución del programa
    public static void main(String args[])
    {
        System.out.println("\n********************************************************\n");
        System.out.println("     Bienvenido al sistema de cola con prioridad\n");
        System.out.println("*********************************************************");

        //genera los 1000 números random
        Random();

        //ciclo para repetir hasta que quiera salir del programa
        do
        {
            Menu();
        } while (hacer!=3);//hasta que precione salir
        System.out.println("\n\n¡Gracias por utilizar el programa!");
    }

    //método que despliega el menú para realizar la acción del usuario ****************************
    public static void Menu(){
        do //ciclo hasta que ingrese bien una acción a realizar
        {
            System.out.println("\n\t** Menu Principal del sistema de cola con prioridad **");
            System.out.println("1- Ver datos");
            System.out.println("2- Generar nuevos números random");
            System.out.println("3- Salir del Programa");
            System.out.print("\t¿Qué desea hacer?\tMarque el número: ");
            //despliega mensaje de error si no escoje una opcion del menu principal
            try{
                hacer=scan.nextInt();
            }
            catch(Exception exp){ //para prevenir el ingreso de algún caracter diferente a número
                System.out.println("¡Error accion no válida!\n");
                hacer=-1;
            }
            scan.nextLine();
            if ((hacer<1 || hacer>3) &&(hacer!=-1))
                System.out.println("¡Error accion fuera de las opciones!\n");

        } while (hacer<1 || hacer>3);
        System.out.println("\n*************************************************************\n");
        //para realizar la accion marcada arriba
        switch (hacer)
        {
            case 1://  ********* VER DATOS ***********************************************
                int num2=0;
                for(int i=0;i<Numeros.size();i++){
                    Cola_heap_propio.push(Numeros.get(i),Numeros.get(i));
                    Cola_heap_JCF.push(Numeros.get(i),Numeros.get(i));
                }
                //******************* imprimir parte propia **************************
                System.out.println(">> Implementación propia de cola con prioridad, utilizando heap <<");
                int num1=Cola_heap_propio.pop();

                while(Cola_heap_propio.empty()==false){
                    num2=Cola_heap_propio.pop();
                }

                System.out.println("\t>> Menor: "+num1);
                System.out.println("\t>> Mayor: "+num2);
                System.out.println("\n*************************************************************\n");
                //******************* imprimir parte de JCF **************************
                System.out.println(">> Implementación de cola con prioridad (PriorityQueue) de JCF <<");

                num1=Cola_heap_JCF.pop();

                while(Cola_heap_JCF.empty()==false){
                    num2=Cola_heap_JCF.pop();
                }

                System.out.println("\t>> Menor: "+num1);
                System.out.println("\t>> Mayor: "+num2);
                System.out.println("\n*************************************************************\n");
                break;
            case 2://  ********* GENERAR NUEVOS RANDOM ***********************************************
                Random();
                break;
        }
    }
    //método para generar los valores random de los números
    public static void Random(){
        
        Numeros.clear();//Borrar la lista anterior

        Random rnd = new Random();
        //generar una nueva lista
        while (Numeros.size()<cant)
        {
            int a=rnd.nextInt(rango);//número random entre 1-10000 (no mencina el documento el rango)
            Numeros.add(a);
            //ciclo para que no salgan repetidos
            for(int b=0;b<Numeros.size()-1;b++)
                if (a==Numeros.get(b)){
                    Numeros.remove(Numeros.size()-1);
                    break;
                }
        }
        ///*//para imprimir la lista de números generados
            int mayor=0;
            int menor=10000;
            for(int b=0;b<Numeros.size()-1;b++){
                if(Numeros.get(b)>mayor)
                    mayor=Numeros.get(b);
                if(Numeros.get(b)<menor)
                    menor=Numeros.get(b);
                //System.out.println("numero: "+Numeros.get(b));
            }
            System.out.println("numero mayor: "+mayor);//prueba
            System.out.println("numero menor: "+menor);//prueba
            System.out.println("Tamaño: "+Numeros.size());//prueba
         //*/
    }



}

